home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tech Arsenal 1
/
Tech Arsenal (Arsenal Computer).ISO
/
tek-02
/
indx18eu.zip
/
FILES.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1991-03-20
|
8KB
|
332 lines
UNIT Files ;
INTERFACE
CONST
FILE_POSITION_OUT_OF_RANGE = 1 ;
CONST
FILE_READ_ERROR = 2 ;
CONST
FILE_WRITE_ERROR = 3 ;
VAR
fileError : WORD ;
PROCEDURE InsertRecord ( VAR f : FILE ;
VAR buffer ;
position : LONGINT ;
lRecL : WORD ) ;
PROCEDURE DeleteRecord ( VAR f : FILE ;
position : LONGINT ;
lRecL : WORD ) ;
IMPLEMENTATION
PROCEDURE InsertRecord ( VAR f : FILE ;
VAR buffer ;
position : LONGINT ;
lRecL : WORD ) ;
VAR
bytesToMove : LONGINT ;
fSize : LONGINT ;
readPosition : LONGINT ;
writePosition : LONGINT ;
memBuf : POINTER ;
memBufSize : WORD ;
toMove : WORD ;
numRead : WORD ;
numWritten : WORD ;
maxBufferRecords : WORD ;
lastLoop : BOOLEAN ;
quitLoop : BOOLEAN ;
BEGIN { InsertRecord }
fSize := FileSize ( f ) ;
IF ( position > ( fSize / lRecL ) )
THEN
BEGIN
fileError := FILE_POSITION_OUT_OF_RANGE ;
Exit ;
END ; { IF }
bytesToMove := ( fSize - ( position * lRecL ) ) ;
memBufSize := MaxAvail ;
maxBufferRecords := memBufSize DIV lRecL ;
memBufSize := maxBufferRecords * lRecL ;
GetMem ( memBuf , memBufSize ) ;
IF ( bytesToMove <= memBufSize )
THEN
BEGIN
Seek ( f , ( position * lRecL ) ) ;
BlockRead ( f , memBuf^ , bytesToMove , numRead ) ;
IF ( numRead < bytesToMove )
THEN
BEGIN
fileError := FILE_READ_ERROR ;
Exit ;
END ; { IF }
Seek ( f , ( ( position + 1 ) * lRecL ) ) ;
BlockWrite ( f , memBuf^ , bytesToMove , numWritten ) ;
IF ( numWritten < bytesToMove )
THEN
BEGIN
fileError := FILE_WRITE_ERROR ;
Exit ;
END ; { IF }
END { THEN }
ELSE
BEGIN
readPosition := ( fSize DIV lRecL ) - maxBufferRecords ;
writePosition := readPosition + 1 ;
lastLoop := FALSE ;
quitLoop := FALSE ;
toMove := memBufSize ;
REPEAT
IF ( lastLoop )
THEN
quitLoop := TRUE ;
Seek ( f , readPosition * lRecL ) ;
BlockRead ( f , memBuf^ , toMove , numRead ) ;
IF ( numRead < toMove )
THEN
BEGIN
fileError := FILE_READ_ERROR ;
Exit ;
END ; { IF }
Seek ( f , writePosition * lRecL ) ;
BlockWrite ( f , memBuf^ , toMove , numWritten ) ;
IF ( numWritten < toMove )
THEN
BEGIN
fileError := FILE_WRITE_ERROR ;
Exit ;
END ; { IF }
readPosition := readPosition - maxBufferRecords ;
IF ( readPosition <= position )
THEN
BEGIN
toMove := ( writePosition - position - 1 ) * lRecL ;
readPosition := position ;
lastLoop := TRUE ;
END ; { IF }
writePosition := readPosition + 1 ;
UNTIL ( quitLoop ) ;
END ; { ELSE }
FreeMem ( memBuf , memBufSize ) ;
Seek ( f , ( position * lRecL ) ) ;
BlockWrite ( f , buffer , lRecL , numWritten ) ;
IF ( numWritten < lRecL )
THEN
BEGIN
fileError := FILE_WRITE_ERROR ;
Exit ;
END ; { IF }
END ; { InsertRecord }
PROCEDURE DeleteRecord ( VAR f : FILE ;
position : LONGINT ;
lRecL : WORD ) ;
VAR
bytesToMove : LONGINT ;
fSize : LONGINT ;
readPosition : LONGINT ;
writePosition : LONGINT ;
memBuf : POINTER ;
memBufSize : WORD ;
toMove : WORD ;
numRead : WORD ;
numWritten : WORD ;
maxBufferRecords : WORD ;
lastLoop : BOOLEAN ;
quitLoop : BOOLEAN ;
BEGIN { DeleteRecord }
fSize := FileSize ( f ) ;
IF ( ( position + 1 ) > ( fSize / lRecL ) )
THEN
BEGIN
fileError := FILE_POSITION_OUT_OF_RANGE ;
Exit ;
END ; { IF }
bytesToMove := ( fSize - ( ( position + 1 ) * lRecL ) ) ;
memBufSize := MaxAvail ;
maxBufferRecords := memBufSize DIV lRecL ;
memBufSize := maxBufferRecords * lRecL ;
GetMem ( memBuf , memBufSize ) ;
IF ( bytesToMove <= memBufSize )
THEN
BEGIN
Seek ( f , ( ( position + 1 ) * lRecL ) ) ;
BlockRead ( f , memBuf^ , bytesToMove , numRead ) ;
IF ( numRead < bytesToMove )
THEN
BEGIN
fileError := FILE_READ_ERROR ;
Exit ;
END ; { IF }
Seek ( f , ( position * lRecL ) ) ;
BlockWrite ( f , memBuf^ , bytesToMove , numWritten ) ;
IF ( numWritten < bytesToMove )
THEN
BEGIN
fileError := FILE_WRITE_ERROR ;
Exit ;
END ; { IF }
END { THEN }
ELSE
BEGIN
readPosition := ( position + 1 ) ;
writePosition := position ;
lastLoop := FALSE ;
quitLoop := FALSE ;
toMove := memBufSize ;
REPEAT
IF ( lastLoop )
THEN
quitLoop := TRUE ;
Seek ( f , readPosition * lRecL ) ;
BlockRead ( f , memBuf^ , toMove , numRead ) ;
IF ( numRead < toMove )
THEN
BEGIN
fileError := FILE_READ_ERROR ;
Exit ;
END ; { IF }
Seek ( f , writePosition * lRecL ) ;
BlockWrite ( f , memBuf^ , toMove , numWritten ) ;
IF ( numWritten < toMove )
THEN
BEGIN
fileError := FILE_WRITE_ERROR ;
Exit ;
END ; { IF }
readPosition := readPosition + maxBufferRecords ;
IF ( readPosition >= ( fSize DIV lRecL ) )
THEN
quitLoop := TRUE ;
IF ( readPosition + maxBufferRecords >= ( fSize DIV lRecL ) )
THEN
BEGIN
toMove := fSize - ( readPosition * lRecL ) ;
lastLoop := TRUE ;
END ; { IF }
writePosition := readPosition - 1 ;
UNTIL ( quitLoop ) ;
END ; { ELSE }
FreeMem ( memBuf , memBufSize ) ;
Seek ( f , ( fSize - lRecL ) ) ;
Truncate ( f ) ;
END ; { DeleteRecord }
BEGIN
fileError := 0 ; { no error yet }
END .